Tool configs
In general the whole idea with plz is that configs get reasonable defaults, depending on the project type. Plz also takes care of adjusting / translating the configs to the different tools, as they might have slightly different formats for the same things (e.g. aliases in webpack and jest).
Extending configs
If you want to extend or override (parts of) the configs, you can do so via the plz config, e.g. through a .plzrc.js file (or any other config file convention supported by cosmiconfig.
const { themes } = require('@storybook/theming');
module.exports = {
projectType: 'react-app', // for example
bugsnag: {
appKey: 'key-from-bugsnag-project' // optional, used for bugsnag webpack plugin
},
babel: (config) => {
// gets the config plz generated
// you can do whatever you want to the config here
// and simply return your final version
return config;
},
webpack: (config) => {
// same as above
return config;
},
storybook: {
// e.g. for custom themes or any other option parameter
// will be passed to `addParameters` as options
theme: themes.dark
}
};
Webpack
info
webpack is mainly used for bundling app projects. There are configs for react component and module projects as well, but they are only used for other tools that need a webpack config, e.g. storybook. Beyond that we do not bundle these packages and instead assume they will be properly bundled, minified, etc. on app level.
We might wanna change this, and use either a very basic webpack setup or (even better?) a simple rollup setup to bundle libraries.
Plugins
https://webpack.js.org/configuration/plugins/#plugins
CaseSensitivePathsPlugin
React Component / Module — Plugin that makes sure import paths are treated case sensitive, to avoid conflicts created by developers working on macOS (which has a case insensitive file system).
https://github.com/Urthen/case-sensitive-paths-webpack-plugin
moment
React App / React Component / Module — Custom context replacement plugin that removes all locales from moment (except for en-au).
https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
ValidatorjsPlugin
React App / React Component / Module — Similar to the moment plugin, this removes all locales from the validators package except for en.
https://github.com/julianburr/validatorjs-webpack-plugin
status
React App (dev) — Custom plugin for additional logging during dev mode
HotModuleReplacementPlugin
React App (dev) — Enables Hot Module Replacement (HMR) during dev mode
https://webpack.js.org/plugins/hot-module-replacement-plugin/
NamedModulesPlugin
React App (dev) — Improves DX in dev mode.
https://webpack.js.org/configuration/mode#mode-development
HtmlPlugin
React App — Plugin that simplifies creating and handling of HTML files, especially with hashed filenames. Handles the app entry HTML file.
https://github.com/jantimon/html-webpack-plugin
MiniCssExtractPlugin
React App — Simple and lightweight plugin to extract CSS files.
https://github.com/webpack-contrib/mini-css-extract-plugin
HashedModuleIdsPlugin
React App (prod) — Plugin for module identification in production.
NamedModulesPlugin
React App (dev) — Plugin for module identification in dev mode.
BundleAnalyzerPlugin
React App (prod, with stats option) — Creates bundle size stats from the generated webpack bundles and allows showing the size stats visualised as a dependecy map in the browser.
# Gets added to the webpack config when the option stats is defined
plz build --stats
https://github.com/webpack-contrib/webpack-bundle-analyzer
BugsnagSourceMapUploaderPlugin
React App (prod) — Only applied if plz config has bugsnag.appKey defined. Uploads source maps to bugsnag on build. You can define bugsnag.appVersion in the plz config as well, if not defined the plugin will fall back using the version in your apps package json.
ForkTsCheckerWebpackPlugin
React App - Webpack plugin that runs the TypeScript type checker on a separate process.
https://github.com/TypeStrong/fork-ts-checker-webpack-plugin
###Optimizations
minimize
React App (prod), React Component, Module — JS code minification is activated for production code.
https://webpack.js.org/configuration/optimization#optimizationminimize
minimizer
React App (prod), React Component, Module — Plugin used in the optimizations of the production config to use terser as the parser for JS code minification.
https://github.com/webpack-contrib/terser-webpack-plugin
https://github.com/terser-js/terser
https://webpack.js.org/configuration/optimization#optimizationminimizer
noEmitOnErrors
React App (prod) — Prevents erroring assets from being emitted during compilation.
https://webpack.js.org/configuration/optimization#optimizationnoemitonerrors
namedModules / namedChunks
React App (dev) — Improved DX during dev mode.
Rules / Loaders
https://webpack.js.org/configuration/module/#modulerules
Babel
React App, React Component, Module — Standard babel loader for JS/JSX and TS/TSX files. plz uses Babel to transpile TypeScript, stripping out type annotations. Babel does not perform type checking; that's handled by the ForkTsCheckerWebpackPlugin plugin.
https://webpack.js.org/loaders/babel-loader
CSS & PostCSS
? — Loader for CSS files. For React Apps we use the loader from the MiniCssExtractPlugin.
https://github.com/webpack-contrib/css-loader
https://github.com/webpack-contrib/mini-css-extract-plugin
SVG React Loader
React App, React Component, Module — Loader that transforms SVG files into React components. This loader is used by default on all SVGs except for files with the file name schema *.url.svg. This schema forces the use of the URL loader (see below).
https://github.com/jhamlet/svg-react-loader
URL
React App, React Component, Module — Returns the file path for the imported file (taking webpack plugins and chunk hashes into account). By default we use that for all images (gif, png, webp, jpe), SVGs if the file name ends with .url.svg, font files (eot, otf, ttf, woff, woff2), video files (mp4,ogg, webm) and audio files (wav, mp3, m4a, aac, oga)
https://webpack.js.org/loaders/url-loader/
Aliases
https://webpack.js.org/configuration/resolve/
Aliases are a convenient way to allow absolute paths in your import statements. This is especially handy if you have a lot of nested files, that otherwise would need relative paths in their imports.
React App
src → ./src
data → ./src/data
view → ./src/view
utils → ./src/utils
theme → ./src/theme
routes → ./src/routes
config → ./src/config
store → ./src/store
React Component / Module
src → ./src
Babel
Presets
env
React App, React Component, Module — https://babeljs.io/docs/en/next/babel-preset-env
react
React App, React Component, Module — https://babeljs.io/docs/en/next/babel-preset-react
typescript
React App - https://babeljs.io/docs/en/next/babel-preset-typescript
Plugins
proposal-decorators (legacy)
React App, React Component, Module — Adds support for decorator syntax (for the legacy proposal).
https://babeljs.io/docs/en/next/babel-plugin-proposal-decorators.html
proposal-class-properties
React App, React Component, Module — Allows defining class properties outside of the constructor.
https://babeljs.io/docs/en/next/babel-plugin-proposal-class-properties
proposal-json-strings
React App, React Component, Module — https://babeljs.io/docs/en/next/babel-plugin-proposal-json-strings
proposal-object-rest-spread
React App, React Component, Module — https://babeljs.io/docs/en/next/babel-plugin-proposal-object-rest-spread
syntax-import-meta
React App, React Component, Module — https://babeljs.io/docs/en/next/babel-plugin-syntax-import-meta
transform-runtime
React App, React Component, Module — This plugin makes sure babels helper code, that gets injected, is being reused, to reduce bundle size.
https://babeljs.io/docs/en/next/babel-plugin-transform-runtime
syntax-dynamic-import
React App, React Component, Module — https://babeljs.io/docs/en/next/babel-plugin-syntax-dynamic-import
transform-react-remove-prop-types
React App (prod), React Component, Module — Removes prop types from the code in production mode to reduce bundle size.
https://github.com/oliviertassinari/babel-plugin-transform-react-remove-prop-types
transform-react-jsx-source
React App (dev) — https://babeljs.io/docs/en/babel-plugin-transform-react-jsx-source
transform-react-jsx-self
React App (dev) — https://babeljs.io/docs/en/babel-plugin-transform-react-jsx-self
Jest
React App, React Component, Module
The main goal with the jest config is that it automatically transforms any webpack options into whatever jest expects them to look like, removing any pain of having to adjust configs in multiple places.
Options
moduleNameMapper
Loads in the webpack aliases for the specific project type and transforms them into the jest module name mapper syntax. It also adds mappers for blob mocks, css mocks and for the stories entry file.
https://jestjs.io/docs/en/configuration#modulenamemapper-object-string-string
modulePathIgnorePatterns
Set to ignore node_modules.
https://jestjs.io/docs/en/configuration#modulepathignorepatterns-array-string
rootDir
Set to the current working directory.
https://jestjs.io/docs/en/configuration#rootdir-string
resolver
We copied jests default resolver and added support for remapping the "main" field to the value of "plz:main" when this is present, to improve DX within libraries that were bootstrapped with plz.
https://jestjs.io/docs/en/configuration#resolver-string
transform
Custom transformer that uses babel-jest to apply the packages/apps babel config correctly to the jest setup.
https://jestjs.io/docs/en/configuration#transform-object-string-string
https://github.com/facebook/jest/tree/master/packages/babel-jest
transformIgnorePatterns
Ignores node_modules, unless the runtimeCompilation option is set in the projects plz configuration.
https://jestjs.io/docs/en/configuration#transformignorepatterns-array-string
modulePaths
Makes sure that both the projects as well as plz's node_modules get included. That should ensure that react is available in e.g. component projects (where it would be a peer dependency).
https://jestjs.io/docs/en/configuration#modulepaths-array-string
testRegex
Regex to find test files within the project, set to (/src/__tests__/.*|(\\.|/)(test|spec))\\.jsx?$
https://jestjs.io/docs/en/configuration#testregex-string-array-string
automock
Disables automatic mocking by default.
https://jestjs.io/docs/en/configuration#automock-boolean
setupFiles
Some custom shims and setups that will be executed before every test run. This includes shims for requestAnimationFrame and cancelAnimationFrame, as well as setting up enzyme (incl. the React adapter for React 16).
https://jestjs.io/docs/en/configuration#setupfiles-array
https://airbnb.io/enzyme/docs/installation/react-16.html
Storybook
React App, React Component
As with jest, the goal with the storybook config that comes with plz is to reuse the webpack/babel configs from the project as much as possible. So in the following we'll focus on the storybook specific settings and addons.
Addons
Knobs
Allows specifying props for your stories and will then enable adjusting these props in the UI. Supports various prop types.
https://github.com/storybooks/storybook/tree/master/addons/knobs
A11y
Shows accessibility information about the story in the storybook sidebar.
https://github.com/storybooks/storybook/tree/master/addons/a11y
Actions
Allows storybook specific logging e.g. to apply to event handlers to test those in storybook.
https://github.com/storybooks/storybook/tree/master/addons/actions
Theming
The latest version of storybook allows us to apply custom themes. By default plz does not apply any theme, but you can do so by adding the srotybook.theme option to your plz config.
https://github.com/storybooks/storybook/blob/master/docs/src/pages/configurations/theming/index.md
How does plz load the stories
Plz wraps around storybooks core. Depending on where plz stories is called from (root of project vs root of mono repo) plz will create a glob pattern file and will then try to match all files in the project that follow that pattern. For projects this pattern is src/.stories.js for the stories and README.md for readme's (to be pulled in via the vivid specific custom addon).